from fastapi import APIRouter,Depends
from fastapi.responses import StreamingResponse
from upfile.upfile import file_list
import os
from model.chat_model import chat_model
import base64
from api.new_api import generate
from user.user import user,oauth2_scheme,verify_user


# 将init定义为APIRouter对象，而不是函数
api = APIRouter()

# 为init路由器添加自己的路由


@api.post('/chat')
async def chat_handler(chat:chat_model,username:str=Depends(verify_user)):
    if username == chat.username:
        file_urls = []
        for file_id in file_list:
            if(file_id in chat.filelist_id):
                # 构建文件的完整路径
                file_path = os.path.join("temp", file_id)
                
                # 检查文件是否存在
                if os.path.exists(file_path):
                    # 可以选择返回相对路径或构建完整URL
                    file_urls.append(file_path)
                    file_list.remove(file_id)
                else:
                    print(f"文件不存在: {file_path}")


        #new_api对话---------------------------------------------------------------------
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ',#测试api
        }
        #对话记录
        messages = []

        for hsmessage in chat.history_message:
            messages.append({
                'role': 'user' if hsmessage.isuser else 'assistant',
                'content': hsmessage.content  # 直接使用内容文本，不要包装成对象
            })
        
        # 构建符合OpenAI标准的多模态内容
        # OpenAI多模态格式：content应该是一个列表，包含文本和图片
        content_list = [{"type": "text", "text": chat.message}]

        # 修改图片URL构建方式
        for file_path in file_urls:
            with open(file_path, "rb") as image_file:
                base64_image = base64.b64encode(image_file.read()).decode('utf-8')
                content_list.append({
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/png;base64,{base64_image}"
                    }
                })
        
        # 将历史消息和当前消息合并
        messages.append({
            'role': 'user',
            'content': content_list
        })
        
        json_data = {
            'model': 'yi-large',
            'messages': messages,
            'stream': True,
        }
        
        return StreamingResponse(generate(headers,json_data), media_type="text/event-stream")
    else:
        return {'message':'用户不匹配！'}